#include "sys_support_printf.h"
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
 
#define USE_MEM_PRINTF			1

#define PRINTF_CACHE_MAX_LEN	256
#define DebugOutputSize         2048
#define TabSize					4
#define RowSize					64
 
char DebugOutput[DebugOutputSize] __attribute__((at(0x20002000)));     
 
static void mem_print_char(char _char)
{
	static unsigned short cnt = 0;
	
	/* 处理制表符，视作续写四个空格 */
	if(_char == '\t')
	{
		for(char i=0;i<TabSize;i++)
		{
			mem_print_char(' ');
		}
	}
	/* 处理换行符，光标移动到下一行 */
	else if(_char == '\n')
	{
		unsigned short col_pos = cnt % RowSize;
		cnt = cnt - col_pos + RowSize;
	}
	/* 处理一般字符，在光标位置输出对应字符 */
	else
	{
		DebugOutput[cnt] = (unsigned char)_char;
		cnt ++;
	}
	
	/* 确保下一次进入时光标在指定内存区域内循环流动 */
	if(cnt >= DebugOutputSize)
	{
		cnt = 0;
	}
	
	/* 如果下一次运行的光标位置在下一行，先清除下一行中之前的数据 */
	if(cnt % RowSize == 0)
	{
		for(unsigned char i=0;i<RowSize;i++)
		{
			DebugOutput[cnt+i] = ' ';
		}
	}
}

char printf_cache[PRINTF_CACHE_MAX_LEN];
/**
 * @brief 打印函数
 * 
 * @param _format 字符串
 * @param ... 参数
 * @return int8_t 
 */
int8_t sys_printf(const char * _format, ...)
{
	uint16_t string_len = 0;
	va_list ap;
	va_start(ap,_format);
	vsnprintf(printf_cache, PRINTF_CACHE_MAX_LEN, _format, ap);
	va_end(ap);
	
	string_len = strlen(printf_cache);
	// assert(string_len < PRINTF_CACHE_MAX_LEN);

	#if USE_MEM_PRINTF == 1
	
	for(uint8_t i = 0; i < string_len; i++)
	{
		mem_print_char(printf_cache[i]);
	}

	#endif

	return 0;
}
